package net.alche.al.util.alches;

import java.lang.reflect.Type;
import java.text.SimpleDateFormat;
import java.util.Map;

import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken;

import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
import net.alche.al.util.AC;
import net.alche.al.util.Far;

// Json相关的工具方法
@SuppressWarnings("all")
public class ToolJson {
  // static ObjectMapper objectMapper = null;

  // public ObjectMapper objectMapper() {
  // return getJsonUtil();
  // }

  // private ObjectMapper getJsonUtil() {
  // if ( objectMapper == null) {
  // objectMapper = new ObjectMapper();
  // objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
  // objectMapper.setVisibility(PropertyAccessor.ALL,
  // JsonAutoDetect.Visibility.ANY);
  // objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
  // objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,
  // false);
  // }
  // return objectMapper;
  // }

  //
  // 将Json数据转换成Map对象
  // @param json json字符串
  // @return
  public Map getMap(String json) {
    try {
      return Far.gson.fromJson(json, HashMap.class);
    } catch (Exception e) {
      e.printStackTrace();
    }
    return null;
  }

  private static final Type JSON_OBJECT_TYPE = new TypeToken<List<JsonObject>>() {
  }.getType();

  //
  // 将Json数据转换成List对象
  //
  // @param json json字符串
  // @return
  //
  public <T> List getList(String json, Class<T> clas) {
    try {
      List<JsonObject> jsonObjectList = Far.gson.fromJson(json, JSON_OBJECT_TYPE);
      List<T> list = new ArrayList<>();
      for (JsonObject jsonObject : jsonObjectList) {
        list.add(Far.gson.fromJson(jsonObject.toString(), clas));
      }
      return list;
      // return Far.gson.fromJson(json, new TypeToken<List<T>>() {
      // }.getType());
      // JavaType javaType =
      // getJsonUtil().getTypeFactory().constructParametricType(ArrayList.class,
      // clas);
      // return (List) getJsonUtil().readValue(json, javaType);
    } catch (Exception e) {
      e.printStackTrace();
    }
    return null;
  }

  public List<Map> getMapList(String json) {
    if (AC.empty(json)) {
      return null;
    }
    try {
      return Far.gson.fromJson(json, new TypeToken<List<HashMap>>() {
      }.getType());
      // JavaType javaType =
      // getJsonUtil().getTypeFactory().constructParametricType(ArrayList.class,
      // Map.class)
      // return getJsonUtil().readValue(json, List.class);
    }
    // return (List) getJsonUtil().readValue(json, javaType)
    catch (Exception e) {
      e.printStackTrace();
    }
    return null;
  }

  //
  // 将Json数据转换成对象
  //
  // @param json json字符串
  // @param clas 对象类名称
  // @return
  //
  public <T> T getObj(String json, Class clas) {
    try {
      return (T) Far.gson.fromJson(json, clas);
      // return (T) getJsonUtil().readValue(json, clas);
    } catch (Exception e) {
      e.printStackTrace();
    }
    return null;
  }

  public String toStr(Object obj) {
    try {
      return Far.gson.toJson(obj);
      // return getJsonUtil().writeValueAsString(obj);
    } catch (Exception e) {
      e.printStackTrace();
    }
    return null;
  }
}